package com.czmini.cztest.service.impl;

import com.czmini.cztest.common.Token;
import com.czmini.cztest.common.TokenDb;
import com.czmini.cztest.config.UserBaseStr;
import com.czmini.cztest.dao.ZcTestUserMapper;
import com.czmini.cztest.dto.ResultDto;
import com.czmini.cztest.dto.TokenDto;
import com.czmini.cztest.entity.ZcTestUser;
import com.czmini.cztest.service.ZcTestUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @ProjectName: cztest
 * @Package: com.czmini.cztest.service.impl
 * @ClassName: ZcTestUserServiceImpl
 * @Author: 还是那个橙子
 * @Description:
 * @Date: 2022/3/4 21:12
 * @Version: 1.0
 */
//@Component  // 声明为spring 的bean，注入到spring中
@Service
@Slf4j
public class ZcTestUserServiceImpl implements ZcTestUserService {

    @Autowired
    private TokenDb tokenDb;

    @Autowired(required = true)
    private ZcTestUserMapper zcTestUserMapper;

    @Override
    public ResultDto<ZcTestUser> save(ZcTestUser zcTestUser) {
        //校验用户名是否存在
        String userName = zcTestUser.getUserName();
        String password = zcTestUser.getPassword();

        ZcTestUser testUser = new ZcTestUser();
        testUser.setUserName(userName);
        List<ZcTestUser> ResultsTestUsersList = zcTestUserMapper.select(testUser);

        //判断D用户是否存在
        if (Objects.isNull(ResultsTestUsersList)||ResultsTestUsersList.size()>0){
                ResultDto.fail("用户名已存在");
        }
        //MD5 加密  spring 自带加密
        String passWordMD5= DigestUtils.md5DigestAsHex((UserBaseStr.md5Hex_sign+userName+password).getBytes());
        zcTestUser.setPassword(passWordMD5);
        //sql save 方法
        zcTestUser.setCreateTime(new Date());
        zcTestUser.setUpdateTime(new Date());
        zcTestUserMapper.insertUseGeneratedKeys(zcTestUser);

        return ResultDto.success("成功",zcTestUser);
    }


    @Override
    public ResultDto<ZcTestUser> update(ZcTestUser ZcTestUser) {
        //查询
        zcTestUserMapper.updateUser(ZcTestUser.getUserName(),ZcTestUser.getPassword(),
                ZcTestUser.getEmail(),ZcTestUser.getAutoCreateCaseJobName(),ZcTestUser.getId());


        return ResultDto.success("成功",ZcTestUser);
    }

    @Override  // 返回token
    public ResultDto<Token> login(String userName, String password) {

        //1、根据用户名+新密码查询数据库中是否存在数据
        ZcTestUser queryzcTestUser = new ZcTestUser();
        //2、获取用户录入的用户名/密码并用MD5加密
        String passWordMD5= DigestUtils.md5DigestAsHex((UserBaseStr.md5Hex_sign+userName+password).getBytes());

        queryzcTestUser.setUserName(userName);
        queryzcTestUser.setPassword(passWordMD5);

        ZcTestUser zcTestUserResult = zcTestUserMapper.selectOne(queryzcTestUser);

        //3、若不存在提示：用户不存在或密码错误
        if (Objects.isNull(zcTestUserResult)){
            return ResultDto.fail("用户不存在或密码错误");
        }

        //4、若存在，则创建Token对象，生成token并将相关信息存入TokenDto
        Token token = new Token();

        String tokenStr = DigestUtils.md5DigestAsHex((System.currentTimeMillis() +userName+ password).getBytes());

        token.setToken(tokenStr);

        TokenDto tokenDto = new TokenDto();

        //设置token
        tokenDto.setUserId(zcTestUserResult.getId());
        tokenDto.setUserName(zcTestUserResult.getUserName());
        tokenDto.setDefaultJenkinsId(zcTestUserResult.getDefaultJenkinsId());
        tokenDto.setToken(tokenStr);

        tokenDb.addTokenDto(tokenStr,tokenDto);

        return ResultDto.success("成功",token);
    }


    // 模糊查询
    @Override
    public ResultDto<List<ZcTestUser>> ByName(ZcTestUser zcTestUser) {
        //mapper形式
       // List<com.czmini.cztest.entity.ZcTestUser> userList = zcTestUserMapper.ByName(ZcTestUser.getUserName(), ZcTestUser.getId());
        //tkmybatis
        List<ZcTestUser> userList = zcTestUserMapper.select(zcTestUser);

        return ResultDto.success("success",userList);
    }

    @Override
    public ResultDto delete(Integer userId) {
        ZcTestUser testUser = new ZcTestUser();
        //设置对应id
        testUser.setId(userId);
        zcTestUserMapper.delete(testUser);
        return ResultDto.success("成功");
    }
}
